package com.rc.web.service.impl;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.rc.pojo.dto.task.TaskAddDTO;
import com.rc.pojo.dto.task.TaskQuery;
import com.rc.pojo.dto.task.TaskUpdateDTO;
import com.rc.pojo.po.EmpTask;
import com.rc.pojo.po.Task;
import com.rc.pojo.vo.task.TaskPageVO;
import com.rc.pojo.vo.task.TaskVO;
import com.rc.web.mapper.TaskMapper;
import com.rc.web.service.EmpTaskService;
import com.rc.web.service.TaskService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 *  服务层实现。
 *
 * @author 27806
 * @since 2024-07-09
 */
/**
 * 任务服务实现类
 * 提供任务相关的业务逻辑实现
 */
@Service
@RequiredArgsConstructor
public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {
    // 员工任务服务
    private final EmpTaskService empTaskService;

    /**
     * 分页查询任务
     * @param query 查询条件
     * @return 分页结果
     */
    @Override
    public Page<TaskPageVO> getPage(TaskQuery query) {
        return mapper.selectPage(query);
    }

    /**
     * 添加任务
     * @param dto 任务添加DTO
     */
    @Override
    @Transactional
    public void add(TaskAddDTO dto) {
        // 构建任务对象并保存
        Task task = Task.builder()
                .title(dto.getTitle())
                .content(dto.getContent())
                .build();
        this.save(task);

        // 构建员工任务关系并批量保存
        List<EmpTask> empTaskList = dto.getEmployeeIds()
                .stream()
                .map((employeeId -> EmpTask.builder()
                        .taskId(task.getId())
                        .employeeId(employeeId)
                        .build()))
                .toList();

        empTaskService.saveBatch(empTaskList);
    }

    /**
     * 根据ID删除任务
     * @param id 任务ID
     */
    @Override
    @Transactional
    public void deleteOneById(Long id) {
        // 删除任务
        this.removeById(id);
        // 删除关联的员工任务关系
        empTaskService.deleteByTaskId(id);
    }

    /**
     * 更新任务
     * @param dto 任务更新DTO
     */
    @Override
    @Transactional
    public void updateOneById(TaskUpdateDTO dto) {
        // 构建任务对象并更新
        Task task = Task.builder()
                .id(dto.getId())
                .title(dto.getTitle())
                .areaId(dto.getAreaId())
                .content(dto.getContent())
                .build();

        this.updateById(task);

        // 删除原有的员工任务关系
        empTaskService.deleteByTaskId(dto.getId());

        // 构建新的员工任务关系并批量保存
        List<EmpTask> empTaskList = dto.getEmployeeIds()
                .stream()
                .map((employeeId -> EmpTask.builder()
                        .taskId(task.getId())
                        .employeeId(employeeId)
                        .build()))
                .toList();

        empTaskService.saveBatch(empTaskList);
    }

    /**
     * 根据ID获取任务详情
     * @param id 任务ID
     * @return 任务VO
     */
    @Override
    public TaskVO getOneById(Long id) {
        // 获取任务
        Task task = this.getById(id);
        Long taskId = task.getId();

        // 获取关联的员工ID列表
        List<Long> empIdList = empTaskService.getEmpIdsByTaskId(taskId);
        
        // 构建并返回任务VO
        return TaskVO.builder()
                .id(taskId)
                .title(task.getTitle())
                .areaId(task.getAreaId())
                .content(task.getContent())
                .employeeIds(empIdList)
                .build();
    }
}
